﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Data;
using UricaoWeb.Datos.ConexionBD.Reportes_Graficos___Housekeeping___Limpieza;
using UricaoWeb.Datos.Excepciones.ReportesyLimpieza;

namespace UricaoWeb.LogicaDeNegocios.Reportes_Graficos___Housekeeping___Limpieza
{
    public class ReportesLogica
    {
        private static List<Parametro> listaParametros;
        private static Reporte reporte = new Reporte();
        public static int hotel = 1;
        public static string _mensaje;

        #region Validación de campos

        ///<sumary>
        ///Metodo que se encarga de validar los campos vacios
        ///Parámetros:
        ///String campoFechaInicio: fecha de incio
        ///String campoFechaFin: fecha fin 
        ///Retorno: 
        ///Bool: Devuelve true o false dependiendo del caso
        ///</sumary>
        public static bool ValidarCamposVacios(string campoFechaInicio, string campoFechaFin)
        {
            if (campoFechaInicio.Equals("") || campoFechaFin.Equals(""))
            {
                return true;
            }
            else
            {
                return false;
            }
        }


        ///<sumary>
        ///Metodo que se encarga de validar las fechas
        ///Parámetros:
        ///DateTime fechaInicio: fecha inicio
        ///DateTime fechaFin: fecha fin 
        ///Retorno: 
        ///Bool: Devuelve true o false dependiendo del caso 
        ///</sumary>
        public static bool ValidarFechas(DateTime fechaInicio, DateTime fechaFin)
        {
            if (fechaFin.CompareTo(fechaInicio) < 0)
            {
                return false;
            }
            else
            {
                return true;
            }
        }



        ///<sumary>
        ///Metodo que se encarga de manejar los mensajes de error 
        ///Parámetros:
        ///Label lmensajeError: componente para mostrar el mensaje de error
        ///String mensaje: mensaje a mostrar 
        ///</sumary>
        private static void MostrarMensajeDeError(Label mensajeError, string mensaje)
        {
            mensajeError.Text = "Error. ";
            mensajeError.Text = mensajeError.Text + mensaje;
            mensajeError.Visible = true;
        }



        ///<sumary>
        ///Metodo que se encarga de la validacion de los campos en la ventana de graficos
        ///Parámetros:
        ///String fechInicio: fecha de incio
        ///String fechaFin: fecha de fin 
        ///Label lMensajeDeError:  componente para los mensajes de error
        ///Retorno: 
        ///Bool: Devuelve true o false dependiendo del caso
        ///</sumary>
        public bool ValidacionesGrafico(string fechInicio, string fechaFin, Label lMensajeDeError)
        {
            if (ValidarCamposVacios(fechInicio, fechaFin))
            {
                MostrarMensajeDeError(lMensajeDeError, ": No se puede dejar ningun campo vacio");
                return false;
            }
            else
            {
                if (!ValidarFechas(Convert.ToDateTime(fechInicio), Convert.ToDateTime(fechaFin)))
                {
                    MostrarMensajeDeError(lMensajeDeError, ": Rango de fechas invalido");
                    return false;
                }
                return true;
            }
        }

        //Validacion de data de graficos tipo torta
        ///<sumary>
        ///Metodo que valida la data en el grafico de tipo torta
        ///Parámetros:
        ///List<DataReporte> data: componente para el manejo de la data
        ///Label lmensajeDeError: componente de los mensajes de error 
        ///Retorno: 
        ///int: valores 0, 1 u -1, dependiendo del caso
        ///</sumary>
        public int ValidacionDataTorta(List<DatoReporte> data, Label lMensajeDeError)
        {
            if (data == null)
            {
                return -1;
            }
            else if (data.Count == 0)
            {
                MostrarMensajeDeError(lMensajeDeError, "No se encontró ningún dato para esta solicitud");
                return 0;
            }

            return 1;
        }


        ///<sumary>
        ///Metodo que valida la data en el grafico de tipo barra
        ///Parámetros:
        ///DataView data: componente para el manejo de la data
        ///Label lmensajeDeError: componente de los mensajes de error 
        ///Retorno: 
        ///Bool: Devuelve true o false dependiendo del caso
        ///</sumary>
        public int ValidacionDataBarra(DataView data, Label lMensajeDeError)
        {
            if (data == null)
            {
                return -1;
            }
            if (data.Count == 0)
            {
                MostrarMensajeDeError(lMensajeDeError, "No se encontró ningún dato para esta solicitud");
                return 0;
            }
            return 1;
        }

        #endregion


        #region Parametros para la BD

        ///<sumary>
        ///Metodo que se encarga de llenar la lista de parametros
        ///Parámetros:
        ///String fechaInicio: fecha de incio
        ///String fechaFin: fecha de fin  
        ///Retorno: 
        ///List<Parametro> list: lista llenada 
        ///</sumary>
        private static List<Parametro> LlenarListaDeParametro(string fechaInicio, string fechaFin)
        {
            List<Parametro> list = new List<Parametro>();

            DateTime inicio = Convert.ToDateTime(fechaInicio);
            DateTime fin = Convert.ToDateTime(fechaFin);

            Parametro parametroFechaInicio = new Parametro("@fechaInicio", inicio);
            Parametro parametroFechaFin = new Parametro("@fechaFin", fin);
            Parametro parametroHotel = new Parametro("@hotel", hotel);

            list.Add(parametroFechaInicio);
            list.Add(parametroFechaFin);
            list.Add(parametroHotel);

            return list;
        }

        #endregion


        #region Lógica de gráficos

        ///<sumary>
        ///Metodo que se encarga de limpiar la variable de error
        ///</sumary>
        public static void LimpiarVariableError()
        {
            _mensaje = "Disculpe en estos momentos no se puede realizar la operación";
        }

        ///<sumary>
        ///Metodo que se encarga de dibujar el grafico de torta con los datos recolectados
        ///Parámetros:
        ///String procedure: procedimiento almacenado
        ///String fechaInicio: fecha de incio
        ///String fechaFin: fecha de fin  
        ///Label mensajeDeError: componente para dar el mensaje de error
        ///Retorno: 
        ///IEnumerable<DatoReporte> reporte: reporte en grafico de torta obtenido adaptado al componente
        ///Excepcion particular1: 
        ///ManejoBDException: Atrapa los errores que se pueden presentar y le envia un mensaje al cliente 
        ///</sumary>
        public List<DatoReporte> GraficoDeTorta(string procedure, string fechaInicio, string fechaFin, Label LMensajeDeError)
        {
            try
            {
                listaParametros = LlenarListaDeParametro(fechaInicio, fechaFin);

                return reporte.DatosGraficoDeTorta(procedure, listaParametros);
            }
            catch (ManejoBDException exception)
            {
                _mensaje = "Error " + exception.Codigo + " " + _mensaje;
                return null;
            }

        }

        ///<sumary>
        ///Metodo que se encarga de dibujar el grafico de barra con los datos recolectados
        ///Parámetros:
        ///String procedure: procedimiento almacenado
        ///String fechaInicio: fecha de incio
        ///String fechaFin: fecha de fin  
        ///Label mensajeDeError: componente para dar el mensaje de error
        ///Retorno: 
        ///DataView datos: reporte en grafico de barra obtenido adaptado al componente 
        ///Excepcion particular1: 
        ///ManejoBDException: Atrapa los errores que se pueden presentar y le envia un mensaje al cliente 
        ///</sumary>
        public DataView GaficoDeBarra(string procedure, string fechaInicio, string fechaFin, Label LMensajeDeError)
        {
            try
            {
                listaParametros = LlenarListaDeParametro(fechaInicio, fechaFin);
                DataView datos = new DataView(reporte.DatosGraficoDeBarra(procedure, listaParametros));
                return datos;
            }
            catch (ManejoBDException exception)
            {
                _mensaje = "Error " + exception.Codigo + " " + _mensaje;
                return null;
            }
        }

        #endregion


    }
}